#include <vcl\vcl.h>
#include <EIC.h>
#pragma hdrstop

#include "Compta.hrc" // Ressources
#include "uCrMoJnl.h"

#pragma package(smart_init)
#pragma link "CEdit"
#pragma link "CDBLkcb"
#pragma link "CCheckB"
#pragma link "CBitBtn"
#pragma resource "*.dfm"
#define MODULE_TAG 1001



/******************************************************************************\
************* TdlgModCreJnl::TdlgModCreJnl() ***********************************
********************************************************************************
*                                                                              *
*    Constructeur du dialogue de modification/création d'un journal.           *
*                                                                              *
* Paramètres :                                                                 *
*   bModifier  : TRUE pour modifier le journal strCodeJnl dans ptblJnx; FALSE  *
*                pour en créer un nouveau.                                     *
*   ptblJnx    : Table (ouverte) dans laquelle modifier/ajouter le journal.    *
*   strCodeJnl : En création de journal; si ce code est vide, le dialogue      *
*                demande à le saisir sinon (s'il est non vide) l'utilisateur   *
*                ne peut pas modifier ce code (il doit seulement compléter les *
*                attributs du journal); sinon, en modification de journal, ce  *
*                paramètre indique le code du journal -OBLIGATOIREMENT         *
*                EXISTANT- à modifier.                                         *
\******************************************************************************/
__fastcall TdlgModCreJnl::TdlgModCreJnl( bool              bModifier,
                                         TTableJnx*        ptblJnx,
                                         const AnsiString& strCodeJnl)
: CForm()
{
 ASSERT( ptblJnx && ptblJnx->Active);
 ASSERT( !ptblJnx->Filtered);

 m_ptblJnx      = ptblJnx;
 dsJnx->DataSet = ptblJnx;
 m_bModifier    = bModifier;
 if( bModifier)
 { // On veut modifier le journal dont le code est passé en paramètre
   ASSERT( edCodeJnl->ReadOnly && !edCodeJnl->TabStop);
   ptblJnx->Get( strCodeJnl, m_jnl);
   ASSERT( m_jnl.Code == strCodeJnl);
   Caption       = "Modification d'un journal";
   btOk->Caption = "&Modifier";
 }
 else if( strCodeJnl.IsEmpty())
 { // On veut créer un nouveau journal (avec un nouveau code)
   ASSERT( edCodeJnl->Text.IsEmpty());
   ASSERT( m_jnl.Code.IsEmpty() && ( m_jnl.Nature == JNNATURE_DEFAULT));
   edCodeJnl->ReadOnly = false;
   edCodeJnl->TabStop  = true;
 }
 else
 { // Le code du journal à créer est déjà initialisé
   ASSERT( edCodeJnl->ReadOnly && !edCodeJnl->TabStop);
   ASSERT( m_jnl.Nature == JNNATURE_DEFAULT);
   m_jnl.Code = strCodeJnl;
 }
 dblookcbJnx->KeyValue = ptblJnx->FieldByName( TTableJnx::strfJN_Code)->AsString;

 ASSERT(rgrpNature->ControlCount == 7);

 rgrpNature->Controls[5]->Enabled = false;
} /* TdlgModCreJnl::TdlgModCreJnl() */



void __fastcall TdlgModCreJnl::DoDataExchange( CDataExchange* pdx)
{
 AnsiString strTmp;  // Variable temporaire
 int        iTmp;

 ASSERT( pdx);

 m_jnl.Code     = DDX_Text(        pdx, edCodeJnl,  strTmp = m_jnl.Code);
                  DDV_StrNotEmpty( pdx,             strTmp);
 m_jnl.Intitule = DDX_Text(        pdx, edIntitule, strTmp = m_jnl.Intitule);
                  DDV_StrNotEmpty( pdx,             strTmp);
 m_jnl.Nature   = (enum JNNature)DDX_RadioGrp(    pdx, rgrpNature, iTmp = m_jnl.Nature);

 // En création d'un journal spécifique ou modification de journal,
 // le code journal ne peut être vide
 ASSERT( !( edCodeJnl->ReadOnly && edCodeJnl->Text.IsEmpty()));
} /* TdlgModCreJnl::DoDataExchange() */


/******************************************************************************\
************* TdlgModCreJnl::FormCloseQuery() **********************************
********************************************************************************
*                                                                              *
*    Cette procédure permet, au moment ou l'utilisateur annule sa saisie, de   *
* lui demander une confirmation d'abandon. L'annulation de la saisie est       *
* réalisée via le bouton "Annuler" (ModalResult = mrCancel) ou via le menu (ou *
* l'icône) système "Fermeture". Lorsque cette procédure est appellée pour      *
* fermer le dialogue suite à une validation de la saisie (via le bouton "Créer"*
* (ModalResult = mrOk)), la demande de confirmation d'annulation n'est pas     *
* réalisée.                                                                    *
*                                                                              *
* Paramètres :                                                                 *
*   pSender   : La fiche elle-même.                                            *
*   bCanClose : FALSE pour annuler la fermeture du dialogue et ainsi continuer *
*               la saisie (valeur en entrée = true).                           *
\******************************************************************************/
void __fastcall TdlgModCreJnl::FormCloseQuery( TObject* pSender,
                                               bool&    bCanClose)
{
 ASSERT( bCanClose);
 ASSERT( ( ModalResult == mrCancel) || // via btAnnuler, menu/icône système "Fermeture" ou btOk inutile
         ( ModalResult == mrOk));      // via btOk utile


 //////////////////////////////////////////////////////////////
 // Confirmation de l'annulation de la modification/création //
 //////////////////////////////////////////////////////////////
 if( ModalResult == mrCancel)
 { // L'utilisateur a cliqué sur le bouton "Annuler" ou le menu/icône système "Fermeture"
   // ou bien le bouton "Créer" a initialisé ModalResult à mrCancel car il n'y a rien à valider
   // => Confirmation d'annulation (n'aura pas lieu si fiche annulée via "Créer" car DataModified == false)
   UpdateData();
   if( DataModified)
     if( !EICQuestion( m_bModifier ? MAKEINTRESOURCE( IDS_QUEST_JOURNAL_ABANDONNER_MODIFICATION)
                                   : MAKEINTRESOURCE( IDS_QUEST_JOURNAL_ABANDONNER_CREATION),
                       Caption.c_str(), MB_DEFBUTTON2))
     { // L'utilisateur ne souhaite pas annuler la création/modification du journal
       // => On continue la saisie
       bCanClose = false;
     }
 }
} /* TdlgModCreJnl::FormCloseQuery() */


/******************************************************************************\
************* TdlgModCreJnl::btOk.Click() **************************************
********************************************************************************
*                                                                              *
*    Cette procédure permet de valider la modification/création du journal.    *
*                                                                              *
* Note :                                                                       *
*   Si une erreur survient pendant la modification/création du journal, la     *
* fiche n'est pas refermée.                                                    *
\******************************************************************************/
void __fastcall TdlgModCreJnl::btOkClick( TObject* pSender)
{
 ASSERT( ModalResult == mrOk);


 ////////////////////////////////////////////////////
 // Lecture des valeurs du journal modifié/à créer //
 ////////////////////////////////////////////////////
 if( !UpdateData())
 { // Pb de saisie invalide
   // => On continue la saisie
   ModalResult = mrNone;
   return;
 }
 else if( !DataModified)
 { // Il n'y a eu aucune modification des données de la fiche
   // => On annule la fiche (elle va se fermer)
   ModalResult = mrCancel;
   return;
 }


  if( m_bModifier)
    { /////////////////////////////
   // Modification du journal //
   /////////////////////////////
      ASSERT( !m_jnl.Code.IsEmpty());
      try
        {
          m_ptblJnx->Modifier( m_jnl);
        }
      catch(EUser &e)
        {
          EICErreur(LoadStr(IDS_EXCEPTION_JOURNAL_A_NOUVEAU_DEJA_EXISTANT));
          ModalResult = mrNone;
        }
      catch( Exception& e)
        {
          EICDisplayException( TAG( 10), e);
          ModalResult = mrNone;
        }
    }
 else
 { /////////////////////////////////
   // Création du nouveau journal //
   /////////////////////////////////
   ASSERT( !m_jnl.Code.IsEmpty());
   try {
     // Création du nouveau journal
     if( !m_ptblJnx->Creer( m_jnl))
     { // Le journal existait déjà; il n'a pas été créé ni modifié
       // => Avertissement à l'utilisateur
       EICAttention( MAKEINTRESOURCE( IDS_WARN_NE_PEUT_CREER_JOURNAL_DEJA_EXISTANT__CORRIGEZ));

       ASSERT( dynamic_cast<TWinControl*>( rgrpNature->Components[ rgrpNature->ItemIndex]));
       ASSERT( ( m_bModifier ? (TWinControl*)edCodeJnl : (TWinControl*)rgrpNature->Components[ rgrpNature->ItemIndex])->Enabled);
       
       ActiveControl = m_bModifier ? (TWinControl*)edCodeJnl : (TWinControl*)rgrpNature->Components[ rgrpNature->ItemIndex];
       ModalResult   = mrNone;
     }
   } catch( Exception& e) {
     EICDisplayException( TAG( 11), e);
     ModalResult = mrNone;
   }
 }
} /* TdlgModCreJnl::btOkClick() */

